/**
 * 语音消息播放工具
 * 功能：播放语音、自动播放下一条、更新进度、错误处理
 */
import store from "../store";
export const VoicePlayer = {
	// 初始化音频上下文
  
	initAudioContext() {
		// 如果已有音频实例，先清理
		if (this.audioContext) {
			this.stop();
			this.audioContext.offTimeUpdate();
			this.audioContext.offEnded();
			this.audioContext.offError();
			this.audioContext = null
		}

		// 创建新的音频实例
		this.audioContext = uni.createInnerAudioContext();

		return this.audioContext;
	},

	/**
	 * 播放语音
	 * @param {Object} vm - 组件实例
	 * @param {Number} index - 消息索引
	 */
	play(vm, index) {
	
		// 验证参数
		if (!vm || !vm.msgList || index === undefined || index < 0) {
			console.error('无效的播放参数');
			return;
		}

		const msg = vm.msgList[index];

		// 验证消息是否包含有效语音
		if (!msg?.content?.voicePath) {
			console.warn('当前消息不包含语音路径');
			return;
		}

		// 如果正在播放当前语音，直接返回
		if (vm.stateConfig?.isPlaying && vm.stateConfig?.isplay === index) {
			return;
		}

		// 初始化音频上下文
		const audioContext = this.initAudioContext();

		// 更新播放状态
		this.updatePlayState(vm, true, index);

		// 设置音频源
		audioContext.src = msg.content.voicePath;

		// 绑定进度更新事件
		audioContext.onTimeUpdate(() => {
			this.updateProgress(vm, msg, audioContext);

		});

		// 绑定播放结束事件
		audioContext.onEnded(() => {
			this.handlePlayEnd(vm, index);
			uni.$emit('progressPercent',100)
		});


		// 绑定错误处理事件
		audioContext.onError((err) => {
			this.handlePlayError(vm, err);
		});

		// 开始播放
		audioContext.play()
		uni.$emit('currentMsg', msg.timestamp)
	},

	/**
	 * 更新播放进度
	 * @param {Object} vm - 组件实例
	 * @param {Object} msg - 消息对象
	 * @param {Object} audioContext - 音频上下文
	 */
	updateProgress(vm, msg, audioContext) {
		const duration = msg.content.duration || 0;
		var persent = 0
		if (duration > 0 && audioContext.currentTime !== undefined) {
			persent = (audioContext.currentTime / duration) * 100
		}
		uni.$emit('progressPercent', persent)
	},

	/**
	 * 处理播放结束
	 * @param {Object} vm - 组件实例
	 * @param {Number} currentIndex - 当前播放索引
	 */
	handlePlayEnd(vm, currentIndex) {
		// 重置当前播放状态
		this.updatePlayState(vm, false, -1);

		// 查找下一条语音消息
	
		const result=store.getters['msg/getConfig']
		console.log(result);
	    if(result.autoPlayVoice){
		const nextIndex = this.findNextAudioMessageIndex(vm, currentIndex);
		if (nextIndex !== -1) {
			// 播放下一条
			this.playNextAfterDelay(vm, nextIndex);
		}	
		}
		
	},

	/**
	 * 延迟播放下一条，确保UI更新完成
	 * @param {Object} vm - 组件实例
	 * @param {Number} nextIndex - 下一条索引
	 * @param {Number} delay - 延迟时间(ms)
	 */
	playNextAfterDelay(vm, nextIndex) {
		if (vm.msgList[nextIndex].timestamp) {

			uni.$emit('viewId', `msg-${vm.msgList[nextIndex].timestamp}`)
          uni.$emit('progressPercent',0)

			this.play(vm, nextIndex);
		}

	},

	/**
	 * 处理播放错误
	 * @param {Object} vm - 组件实例
	 * @param {Object} err - 错误对象
	 */
	handlePlayError(vm, err) {
		console.error('语音播放错误:', err);
		this.updatePlayState(vm, false, -1);

		// 显示错误提示
		uni.showToast({
			title: '语音播放失败',
			icon: 'none',
			duration: 2000
		});
	},

	/**
	 * 更新播放状态
	 * @param {Object} vm - 组件实例
	 * @param {Boolean} isPlaying - 是否正在播放
	 * @param {Number} index - 当前播放索引
	 */
	updatePlayState(vm, isPlaying, index) {
		if (vm.stateConfig) {
			vm.stateConfig.isPlaying = isPlaying;
			vm.stateConfig.isplay = index;
		}
	},

	/**
	 * 查找下一条语音消息的索引
	 * @param {Object} vm - 组件实例
	 * @param {Number} currentIndex - 当前索引
	 * @returns {Number} 下一条语音索引，没有则返回-1
	 */
	findNextAudioMessageIndex(vm, currentIndex) {
		if (!vm.msgList || !Array.isArray(vm.msgList)) {
			return -1;
		}

		for (let j = currentIndex + 1; j < vm.msgList.length; j++) {
			// 假设messageType为1表示音频消息
			if (vm.msgList[j]?.messageType === 1&&vm.msgList[j].senderUserId!==vm.storeData.user.userId) {
				return j;
			}
		}
		return -1;
	},

	/**
	 * 停止播放
	 */
	stop() {
		if (this.audioContext) {
			this.audioContext.stop();
		}
	},

	/**
	 * 销毁音频实例
	 */
	destroy() {
		if (this.audioContext) {
			this.audioContext.stop();
			this.audioContext.offTimeUpdate();
			this.audioContext.offEnded();
			this.audioContext.offError();
			this.audioContext.destroy();
			this.audioContext = null;
		}
	}
};